package com.dh.leetcode.eight;

import org.junit.Assert;
import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @ClassName: _830_positions_of_large_groups
 * @Description: 830. 较大分组的位置
 * 在一个由小写字母构成的字符串 s 中，包含由一些连续的相同字符所构成的分组。
 * <p>
 * 例如，在字符串 s = "abbxxxxzyy" 中，就含有 "a", "bb", "xxxx", "z" 和 "yy" 这样的一些分组。
 * <p>
 * 分组可以用区间 [start, end] 表示，其中 start 和 end 分别表示该分组的起始和终止位置的下标。上例中的 "xxxx" 分组用区间表示为 [3,6] 。
 * <p>
 * 我们称所有包含大于或等于三个连续字符的分组为 较大分组 。
 * <p>
 * 找到每一个 较大分组 的区间，按起始位置下标递增顺序排序后，返回结果。
 * <p>
 * <p>
 * <p>
 * 示例 1：
 * <p>
 * 输入：s = "abbxxxxzzy"
 * 输出：[[3,6]]
 * 解释："xxxx" 是一个起始于 3 且终止于 6 的较大分组。
 * 示例 2：
 * <p>
 * 输入：s = "abc"
 * 输出：[]
 * 解释："a","b" 和 "c" 均不是符合要求的较大分组。
 * 示例 3：
 * <p>
 * 输入：s = "abcdddeeeeaabbbcd"
 * 输出：[[3,5],[6,9],[12,14]]
 * 解释：较大分组为 "ddd", "eeee" 和 "bbb"
 * 示例 4：
 * <p>
 * 输入：s = "aba"
 * 输出：[]
 * <p>
 * 提示：
 * <p>
 * 1 <= s.length <= 1000
 * s 仅含小写英文字母
 * <p>
 * https://leetcode-cn.com/problems/positions-of-large-groups/
 * @Author: shouzimu
 * @Date: 2021/1/5 9:37
 */
public class _830_positions_of_large_groups {

    /**
     * 第一次提交试用Arrays.asList 3ms
     * 第二次使用 直接创建arrayList 1ms
     *
     * @param s
     * @return
     */
    public List<List<Integer>> largeGroupPositions(String s) {
        List<List<Integer>> res = new ArrayList<>();
        char[] array = s.toCharArray();
        int start = 0, end = 0;
        while (end < array.length) {
            if (array[start] != array[end]) {
                if (end - start > 2) {
                    List<Integer> l1 = new ArrayList<>(2);
                    l1.add(start);
                    l1.add(end - 1);
                    res.add(l1);
                }
                start = end;
            }
            end++;
        }
        if (end - start > 2) {
            List<Integer> l1 = new ArrayList<>(2);
            l1.add(start);
            l1.add(end - 1);
            res.add(l1);
        }
        return res;
    }

    @Test
    public void largeGroupPositionsTest() {
        Assert.assertEquals(Arrays.deepToString(new int[][]{{3, 5}, {6, 9}, {12, 14}}), Arrays.toString(largeGroupPositions("abcdddeeeeaabbbcd").toArray()));
        Assert.assertEquals(Arrays.deepToString(new int[][]{{0, 2}}), Arrays.toString(largeGroupPositions("aaa").toArray()));
        Assert.assertEquals(Arrays.deepToString(new int[][]{{3, 6}}), Arrays.toString(largeGroupPositions("abbxxxxzzy").toArray()));
        Assert.assertEquals(Arrays.deepToString(new int[][]{{}}), Arrays.toString(largeGroupPositions("aba").toArray()));
    }
}
